import os
import yaml
import argparse

from utils.configDefault import DEFAULT_CONFIG


class ConfigHandler:
    configs = None
    file_path = 'data/config/conf.yaml'

    # 使用 __init__ 初始化数据 的话，使用一次 ConfigHandler() 会执行一次，如：type(ConfigHandler())
    def LoadData(self):
        # self.file_path = self.walk_config_file()
        pathConfig = os.path.join(self.file_path)
        if not os.path.exists(pathConfig):
            print(f'folder {pathConfig} not exists')
            print("通过Py文件手动创建全局变量")
            self.configs = self.dict2namespace(DEFAULT_CONFIG)
            return self.configs
        # 1.创建解释器
        parser = argparse.ArgumentParser(description="可写可不写，只是在命令行参数出现错误的时候，随着错误信息打印出来。")
        # 2.添加需要的参数
        parser.add_argument('--cfg', type=str, default=self.file_path, help="...")  # a.yaml中内容在文章开始给出
        # 3.进行参数解析
        args = parser.parse_args()
        # print(args.cfg)
        # filepath = os.path.join(os.getcwd(), args.cfg)
        filepath = args.cfg
        with open(filepath, 'r', encoding='utf-8') as f:
            config = yaml.load(f, Loader=yaml.FullLoader)
        self.configs = self.dict2namespace({**config, **vars(args)})
        return self.configs

    def dict2namespace(self, config):
        # 声明命名空间
        namespace = argparse.Namespace()
        for key, value in config.items():
            if isinstance(value, dict):
                new_value = self.dict2namespace(value)
            else:
                new_value = value
            # 将参数对添加到命名空间中
            setattr(namespace, key, new_value)
        return namespace

    def walk_config_file(self, dir_path='data/', config_file='conf.yaml'):
        # 遍历
        for root, dirs, files in os.walk(dir_path):
            # 获取文件名称及路径
            for file in files:
                file_path = os.path.join(root, file)
                file_name = os.path.basename(file_path)
                value = file_name.find(config_file)
                # print(file_path, file_name, value)
                if value != -1:
                    # 找到之后打印
                    print('Get it', file_path)
                    return file_path
        print('Not Found, retry')
        return self.walk_config_file(dir_path='../' + dir_path)


# configHandler = ConfigHandler()
# 程序入口
if __name__ == '__main__':
    configHandler = ConfigHandler()
    configHandler.LoadData()
    # print(globals().get('configs'))
    print(configHandler.configs)
